package br.com.upis.sispat.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.upis.sispat.dao.Dao;
import br.com.upis.sispat.entity.Usuario;
import br.com.upis.sispat.exception.SeamCoreException;
import br.com.upis.sispat.service.AutenticacaoService;
import br.com.upis.sispat.service.UsuarioService;
import br.com.upis.sispat.util.GeradorSenhaUtil;

@Service("autenticacaoService")
public class AutenticacaoServiceImpl implements AutenticacaoService {

	private static final long serialVersionUID = -8843762513366024174L;
	private Dao<Usuario> usuarioDao;
	private UsuarioService usuarioService;

	@Transactional
	public Usuario login(String login, String senha) {

		StringBuilder hql = new StringBuilder();
		hql.append(" select u from ");
		hql.append("Usuario u ");
		hql.append(" where ");
		hql.append(" u.login = ? ");
		hql.append(" and u.senha = ? ");

		Usuario usuario = usuarioDao.getSingleObject(hql.toString(), login,
				senha);

		return usuario;
	}

	@Autowired
	public void setUsuarioDao(Dao<Usuario> usuarioDao) {
		this.usuarioDao = usuarioDao;
	}

	@Override
	@Transactional
	public Usuario changePassword(String login, String senha, String novaSenha)
			throws SeamCoreException {

		Usuario usuario = null;

		usuario = usuarioService.getUsuarioByLogin(login, senha);
		
		if (usuario != null) {
			usuario.setSenha(novaSenha);
			usuario.setSenhaGerada("N");
			usuarioService.update(usuario);
		} else {
			throw new SeamCoreException("Usuário não existente!!!");
		}

		return usuario;
	}

	@Autowired
	public void setUsuarioService(UsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}

	@Override
	@Transactional
	public void createPassword(String login) throws SeamCoreException {

		Usuario usuario = usuarioService.getUsuarioByLogin(login, null);

		if (usuario == null) {
			throw new SeamCoreException("erro.usuario.inexistente");
		}

		String novaSenha = GeradorSenhaUtil.gerarSenha(8, 10);
		usuario.setSenha(novaSenha);
		usuario.setSenhaGerada("S");

		usuarioService.save(usuario);
	}
}
